#ifndef CONFIG_H
#define CONFIG_H

#include <time.h>
#include <pthread.h>

/* definition des constantes*/
/* Pour affichage des traces linux */
#define DEBUG

/* Permissions pour les mecanismes de communications */
#define PERMISSION 0777

/* priorités des messages */
#define PRIO_MSG_L 1
#define PRIO_MSG_XL 2

/* priorités des threads */
#define PRIO_THR_XXXL 50
#define PRIO_THR_XXL 40
#define PRIO_THR_XL 30
#define PRIO_THR_L 20
#define PRIO_THR_S 10

#define PRIO_CONDITIONNEMENT PRIO_THR_L
#define PRIO_IMPRESSION PRIO_THR_L
#define PRIO_PALETTE PRIO_THR_L
#define PRIO_STOCKAGE PRIO_THR_L
#define PRIO_DESTOCKAGE PRIO_THR_L
#define PRIO_LECTURE PRIO_THR_L
#define PRIO_ECRITURE PRIO_THR_L
#define PRIO_ARCHIVAGE PRIO_THR_S
#define PRIO_ERREUR PRIO_THR_XL
#define PRIO_MERE PRIO_THR_XXXL
#define PRIO_AU PRIO_THR_XL

/* nombre de threads/BaL créés par la tâche Mère */
#define NB_THREAD 10
#define NB_BAL 10

/* identifiants des threads */
#define T_CONDITIONNEMENT 0
#define T_IMPRESSION 1
#define T_PALETTE 2
#define T_STOCKAGE 3
#define T_DESTOCKAGE 4
#define T_LECTURE 5
#define T_ECRITURE 6
#define T_ARCHIVAGE 7
#define T_ERREUR 8
#define T_AU 9


/* Etat du clapet : O ouvert, F ferme */
#define CLAPET_F 0
#define CLAPET_O 1

/* Presence palette : OK = presence palette, NOK = absence palette */
#define PALETTE_NOK 0
#define PALETTE_OK 1

/* Presence carton : OK = presence carton, NOK = absence carton */
#define CARTON_NOK 0
#define CARTON_OK 1

/* Etat impression : OK = impression terminee, NOK = erreur a l'impression */
#define IMPRESSION_NOK 0
#define IMPRESSION_OK 1

/* dimensionnement : OK = dimensions correctes, NOK = dimensions incorrectes */
#define PASDEPIECE -1
#define DIMENSION_NOK 0
#define DIMENSION_OK 1

/* retours, decisions apres erreur */
#define FIN_APPLI -1
#define FIN_PROD -2
#define CARTON 1
#define REPRISE 1

/* type de communication vers client Windows */
#define ARCHIVAGE 0
#define ERREUR 1


/* definition des messages pour l'archivage*/
#define ERR_IMP 0
#define PAL_OK 1
#define IMP_HS 2
#define PIECE_DEF 3
#define PALETTE_ABS 4
#define STOCK_OK 5
#define DESTOCK_OK 6
#define FIN_PRODUCTION 7
#define PAS_DE_CARTON 8
#define CARTON_PLEIN 9
#define DEMANDE_FIN 10
#define CMD_IMPOSSIBLE 11
#define CLOSE_APPLI 12
#define LANCEMENT_OF 13
#define AR_URG 14
#define IMP_OK 15
#define ABS_PIECE 16


/* definition des structures pour les messages entre threads*/
/*
Les taches de conditionnement vers Erreur : BAL_versErreur
source : entier (cf. #define)
msg : entier (cf. #define)
heure : date
num lot : entier
num carton en cours : entier
*/
#define BAL_versErreur "/BALversErreur"
typedef struct sMSG_versErreur{
	int source;
	int message;
	time_t heure;
	int numLot;
	int cartonEnCours;
}MSG_versErreur;

/*
Erreur vers les taches de conditionnement : BAL_retErreur
dest : entier (cf. #define)
reponse : entier (ARRET ou REPRISE)
*/
#define BAL_retErreur "/BALretErreur"
typedef struct sMSG_retErreur{
	int dest;
	int reponse;
}MSG_retErreur;

/*
Taches de conditionnement + Erreur + Lecture, vers Archivage (comptes rendus) : BAL_versArchivage
source : entier (cf. #define)
msg : entier (cf. #define)
heure : date
type : entier, compte rendu ou erreur
numLot : entier
num carton en cours : entier
*/
#define BAL_versArchivage "/BALversArchivage"
typedef struct sMSG_versArchivage{
	int source;
	int message;
	time_t heure;
	int numLot;
	int cartonEnCours; 
	int type;
}MSG_versArchivage;

/*
Archivage vers Ecriture : BAL_versEcriture
typeMessage : entier (ERREUR ou ARCHIVAGE)
msg : entier (cf. #define)
heure : date
num lot : entier
num carton en cours : entier
*/
#define BAL_versEcriture "/BALversEcriture"
typedef struct sMSG_versEcriture{
	int typeMessage;
	int message;
	time_t heure;
	int numLot;
	int cartonEnCours;
}MSG_versEcriture;

/*
Lecture vers Erreur : BAL_decisionErreur
reponse : entier (FIN_APPLI ou REPRISE)
*/
#define BAL_decisionErreur "/BALdecisionErreur"
typedef struct sMSG_decisionErreur{
	int reponse;
}MSG_decisionErreur;

/*
Conditionnement vers Impression : BAL_versImpression
Impression vers Palette : BAL_versPalette
Palette vers Stockage : BAL_versStockage
type : entier FIN_APPLI pour fin d'application ou CARTON pour carton
num carton : entier
type produit : caractere ('A' ou 'B')
*/
#define BAL_versImpression "/BALversImpression"
#define BAL_versPalette "/BALversPalette"
#define BAL_versStockage "/BALversStockage"
typedef struct sMSG_carton{
	int type;
	int numCarton;
	int numLot;
	char typeProduit;
}MSG_carton;

/*
Lecture vers Destockage : BAL_versDestockage
nb palettes A: entier
nb palettes B: entier
*/
#define BAL_versDestockage "/BALversDestockage"
typedef struct sMSG_versDestockage{
	int nbPaletteA;
	int nbPaletteB;
}MSG_versDestockage;

/*
Lecture vers Conditionnement (OF) : BAL_demarrage
*/
#define BAL_demarrage "/BALdemarrage"
typedef struct sMSG_demarrage{
	int msg;
}MSG_demarrage;

/* definition des structures des memoires partagees*/

/*
Stockage
Nb palettes A
Nb palettes B
*/
typedef struct sSHM_Stockage{
	int nbPaletteA;
	int nbPaletteB;
}SHM_Stockage;
pthread_mutex_t *MutexSHMStock;
SHM_Stockage *ZoneStockage;
/*
ParametresOF
Num lot
Nb palettes A
Nb cartons / palette A
Nb produits / carton A
Nb palettes B
Nb cartons / palette B
Nb produits / carton B
*/
typedef struct sSHM_ParametresOF{
	int numLot;
	
	int nbPaletteA;
	int taillePaletteA;
	int tailleCartonA;
	
	int nbPaletteB;
	int taillePaletteB;
	int tailleCartonB;
}SHM_ParametresOF;
pthread_mutex_t *MutexSHMOF;
SHM_ParametresOF *OrdreFabrication;
#endif /* CONFIG_H */
